package gobelinmaker.data;

/**
 * Öltés alaposztálya.
 *
 * @author imruf84
 */
public class Stitch {

    /**
     * Sorszám.
     */
    private final int row;
    /**
     * Oszlopszám.
     */
    private final int column;
    /**
     * Fonal.
     */
    private Wool wool = null;
    /**
     * Bal alsó lyuk.
     */
    private final Hole BL;
    /**
     * Jobb felső lyuk.
     */
    private final Hole TR;
    /**
     * Kiindulási lyuk.
     */
    private Hole from;
    /**
     * Végcél lyuk.
     */
    private Hole to;
    /**
     * A csomó fordított állásban van.
     */
    private boolean reversed = false;

    /**
     * Konstruktor.
     *
     * @param row sorszám
     * @param column oszlopszám
     * @param BL bal alsó lyuk
     * @param TR jobb felső lyuk
     */
    public Stitch(int row, int column, Hole BL, Hole TR) {
        this.row = row;
        this.column = column;
        this.BL = BL;
        this.TR = TR;
        this.from = this.BL;
        this.to = this.TR;
    }

    /**
     * Sorszám lekérdezése.
     *
     * @return sorszám
     */
    public int getRow() {
        return this.row;
    }

    /**
     * Oszlopszám lekérdezése.
     *
     * @return oszlopszám
     */
    public int getColumn() {
        return this.column;
    }

    /**
     * Öltés hozzáadása fonalhoz.
     *
     * @param wool fonal
     */
    public void addToWool(Wool wool) {

        // Fonal tárolása.
        this.wool = wool;

        // Ha nincs fonal megadva, akkor kilépünk.
        if (null == wool) {
            return;
        }

        // Öltés hozzáadása a fonalhoz.
        wool.add(this);
    }

    /**
     * Öltés eltávolítása fonalból.
     *
     * @return öltés
     */
    public Wool removeFromWool() {

        Wool w = this.getWool();

        // Ha nincs fonal akkor kilépünk.
        if (null == w) {
            return null;
        }

        w.remove(this);
        this.addToWool(null);
        return w;
    }

    /**
     * Fonal lekrdezése.
     *
     * @return fonal
     */
    public Wool getWool() {
        return this.wool;
    }

    /**
     * Cél lyuk lekérdezése.
     *
     * @return cél lyuk
     */
    public Hole getHoleTo() {
        return this.to;
    }

    /**
     * Öltés irányának a megfordítása.
     */
    public void reverse() {
        Hole d = this.from;
        this.from = this.to;
        this.to = d;
        this.reversed = !this.reversed;
    }

    /**
     * Irány visszaállítása.
     */
    public void resetReversion() {
        this.reversed = false;
        this.from = this.BL;
        this.to = this.TR;
    }

    /**
     * Öltés fordítottságának a lekérdezése.
     *
     * @return igaz ha az öltés fordított, egyébként hamis
     */
    public boolean isReversed() {
        return this.reversed;
    }

    /**
     * Honnan lekérdezése.
     *
     * @return honnan
     */
    public Hole getFrom() {
        return this.from;
    }

    /**
     * Hová lekérdezése.
     *
     * @return hová
     */
    public Hole getTo() {
        return this.to;
    }

    @Override
    public String toString() {
        return "Row:" + this.getRow() + " Column:" + this.getColumn() + " Reversed:" + this.isReversed();
    }
}
